"use strict";
"object" != typeof window.CP && (window.CP = {}),
    window.CP.PenTimer = {
        programNoLongerBeingMonitored: !1,
        timeOfFirstCallToShouldStopLoop: 0,
        _loopExits: {},
        _loopTimers: {},
        START_MONITORING_AFTER: 2e3,
        STOP_ALL_MONITORING_TIMEOUT: 5e3,
        MAX_TIME_IN_LOOP_WO_EXIT: 2200,
        exitedLoop: function (o) {
            this._loopExits[o] = !0
        },
        shouldStopLoop: function (o) {
            if (this.programKilledSoStopMonitoring) return !0;
            if (this.programNoLongerBeingMonitored) return !1;
            if (this._loopExits[o]) return !1;
            var t = this._getTime();
            if (0 === this.timeOfFirstCallToShouldStopLoop) return this.timeOfFirstCallToShouldStopLoop = t,
                !1;
            var i = t - this.timeOfFirstCallToShouldStopLoop;
            if (i < this.START_MONITORING_AFTER) return !1;
            if (i > this.STOP_ALL_MONITORING_TIMEOUT) return this.programNoLongerBeingMonitored = !0,
                !1;
            try {
                this._checkOnInfiniteLoop(o, t)
            } catch (n) {
                return this._sendErrorMessageToEditor(),
                    this.programKilledSoStopMonitoring = !0,
                    !0
            }
            return !1
        },
        _sendErrorMessageToEditor: function () {
            try {
                if (this._shouldPostMessage()) {
                    var o = {
                        action: "infinite-loop",
                        line: this._findAroundLineNumber()
                    };
                    parent.postMessage(JSON.stringify(o), "*")
                } else this._throwAnErrorToStopPen()
            } catch (t) {
                this._throwAnErrorToStopPen()
            }
        },
        _shouldPostMessage: function () {
            return document.location.href.match(/boomerang/)
        },
        _throwAnErrorToStopPen: function () {
            throw "We found an infinite loop in your Pen. We've stopped the Pen from running. Please correct it or contact support@codepen.io."
        },
        _findAroundLineNumber: function () {
            var o = new Error,
                t = 0;
            if (o.stack) {
                var i = o.stack.match(/boomerang\S+:(\d+):\d+/);
                i && (t = i[1])
            }
            return t
        },
        _checkOnInfiniteLoop: function (o, t) {
            if (!this._loopTimers[o]) return this._loopTimers[o] = t,
                !1;
            var i = t - this._loopTimers[o];
            if (i > this.MAX_TIME_IN_LOOP_WO_EXIT) throw "Infinite Loop found on loop: " + o
        },
        _getTime: function () {
            return +new Date
        }
    },
    window.CP.shouldStopExecution = function (o) {
        return window.CP.PenTimer.shouldStopLoop(o)
    },
    window.CP.exitedLoop = function (o) {
        window.CP.PenTimer.exitedLoop(o)
    };